Skip to content

[incubator-kie-issues-2204] Quarkus upgrade 3.27 and Spring Boot to 3.5.10#4178

Merged
yesamer merged 5 commits intoapache:mainfrom
jeejz:quarkus_upgrade_3.27
Feb 19, 2026
Merged

[incubator-kie-issues-2204] Quarkus upgrade 3.27 and Spring Boot to 3.5.10#4178
yesamer merged 5 commits intoapache:mainfrom
jeejz:quarkus_upgrade_3.27

Conversation

@jeejz
Copy link
Contributor

@jeejz jeejz commented Jan 30, 2026

Ticket

apache/incubator-kie-issues#2204

Referenced pull requests

apache/incubator-kie-optaplanner#3201
apache/incubator-kie-drools#6575
#4178
apache/incubator-kie-kogito-apps#2298
apache/incubator-kie-kogito-examples#2162

Major Dependency Upgrades

  • Quarkus: 3.16.3 → 3.27.2
  • Spring Boot: 3.4.11 → 3.5.10
  • Spring Framework: 6.2.1 → 6.2.15
  • AsyncAPI: 2.0.0 → 3.0.0
  • Fabric8 Kubernetes Client: 7.1.0 → 7.3.1

Key Migration Changes

AsyncAPI 3.0.0

  • Operations now separate from channels (not nested)
  • OperationAction.SEND/RECEIVE replaces publish/subscribe model

Fabric8 Kubernetes Client 7.3.1

  • openshift-server-mock removed → use KubernetesMockServer
  • createOrReplace() removed → use createOr()
  • @WithKubernetesTestServer@QuarkusTestResource

Hibernate 7.x

  • Removed explicit child entity persist calls (auto-cascaded from parent)

PostgreSQL / SCRAM

  • SCRAM client: com.ongres.scram:client (2.x) → com.ongres.scram:scram-client (3.x)
  • PostgreSQL image: 15.9-alpine3.2016.8-alpine3.21

Kafka 4.0.0

  • MockProducer constructor now requires explicit partitioner parameter

Quarkus DevTools

  • quarkus-devtools-utilities now explicit dependency
  • Removed deprecated -AlegacyConfigRoot=true compiler argument

Native Build

  • Registered primitive wrapper types for reflection (Float, Double, Integer, etc.)

Test Changes

  • LiveReloadProcessorTest temporarily disabled

Many thanks for submitting your Pull Request ❤️!

Closes/Fixes/Resolves apache/incubator-kie-issues#2204

Dependency Changes for upgrading Spring boot to 3.5.10 and Quarkus to 3.27.2

Please make sure that your PR meets the following requirements:

  • You have read the contributors guide
  • Your code is properly formatted according to this configuration
  • Pull Request title is properly formatted: Issue-XYZ Subject
  • Pull Request title contains the target branch if not targeting main: [0.9.x] Issue-XYZ Subject
  • Pull Request contains link to the JIRA issue
  • Pull Request contains link to any dependent or related Pull Request
  • Pull Request contains description of the issue
  • Pull Request does not include fixes for issues other than the main ticket
How to replicate CI configuration locally?

Build Chain tool does "simple" maven build(s), the builds are just Maven commands, but because the repositories relates and depends on each other and any change in API or class method could affect several of those repositories there is a need to use build-chain tool to handle cross repository builds and be sure that we always use latest version of the code for each repository.

build-chain tool is a build tool which can be used on command line locally or in Github Actions workflow(s), in case you need to change multiple repositories and send multiple dependent pull requests related with a change you can easily reproduce the same build by executing it on Github hosted environment or locally in your development environment. See local execution details to get more information about it.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Upgrades core platform dependencies (Quarkus/Spring Boot) and aligns related libraries (AsyncAPI, Fabric8, Kafka, etc.), including required code/spec/test updates to accommodate upstream API changes.

Changes:

  • Updated BOM-managed dependency versions (Quarkus/Spring Cloud/Fabric8/Kafka/Jackson/etc.).
  • Migrated AsyncAPI specs and the Quarkus AsyncAPI converter to AsyncAPI v3 structure (operations separated from channels).
  • Updated Fabric8 mock-server test infrastructure and Quarkus tests to newer Fabric8/Quarkus testing APIs; adjusted Kafka MockProducer construction for the newer Kafka client.

Reviewed changes

Copilot reviewed 23 out of 23 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
springboot/bom/pom.xml Updates Spring Cloud BOM version to align with the upgraded Spring Boot stack.
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/callbackResults.yaml Migrates AsyncAPI spec to v3 (channels/messages/operations reshaped).
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/asyncAPI.yaml Migrates AsyncAPI spec to v3 (channels/messages/operations reshaped).
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/src/main/resources/specs/asyncAPI.yaml Migrates AsyncAPI spec to v3 for live-reload tests.
quarkus/bom/pom.xml Updates Fabric8 Kubernetes client version managed by the Quarkus BOM.
quarkus/addons/rest-exception-handler/pom.xml Updates test dependency version for jakarta.xml.bind-api.
quarkus/addons/process-management/runtime/pom.xml Updates test dependency version for jakarta.xml.bind-api.
quarkus/addons/process-instance-migration/runtime/pom.xml Updates test dependency version and removes deprecated compiler arg.
quarkus/addons/opentelemetry/runtime/src/main/java/org/kie/kogito/quarkus/serverless/workflow/opentelemetry/config/SonataFlowOtelConfig.java Adds/expands configuration JavaDoc for OpenTelemetry config mapping.
quarkus/addons/opentelemetry/runtime/pom.xml Removes deprecated compiler arg in annotation processor config.
quarkus/addons/opentelemetry/deployment/pom.xml Removes deprecated compiler arg in annotation processor config.
quarkus/addons/kubernetes/test-utils/src/main/java/org/kie/kogito/addons/quarkus/k8s/test/utils/OpenShiftMockServerTestResource.java Migrates OpenShift mock server test resource to Fabric8 7.x APIs.
quarkus/addons/kubernetes/test-utils/src/main/java/org/kie/kogito/addons/quarkus/k8s/test/utils/KubernetesMockServerTestResource.java Migrates Kubernetes mock server test resource to Fabric8 7.x APIs and exposes client.
quarkus/addons/kubernetes/integration-tests/src/test/java/org/kie/kogito/addons/quarkus/kubernetes/ConfigValueExpanderIT.java Updates integration test to use @QuarkusTestResource and injected KubernetesClient.
quarkus/addons/knative/serving/integration-tests/src/test/java/org/kie/kogito/addons/quarkus/knative/serving/customfunctions/it/KnativeServingAddonIT.java Updates test to use @QuarkusTestResource and injected KubernetesClient.
quarkus/addons/jwt-parser/runtime/pom.xml Removes deprecated compiler arg in annotation processor config.
quarkus/addons/jwt-parser/deployment/pom.xml Removes deprecated compiler arg in annotation processor config.
quarkus/addons/grpc/deployment/pom.xml Adds an explicit Quarkus devtools dependency required by the newer Quarkus toolchain.
quarkus/addons/events/rules/deployment/pom.xml Adjusts deployment dependencies (removes an unneeded/duplicate Quarkus deployment dependency).
quarkus/addons/asyncapi/deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/asyncapi/AsyncAPIInfoConverter.java Migrates converter logic to AsyncAPI v3 model (operations/channel ref resolution).
kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/MockKafkaEventEmitterFactory.java Updates MockProducer construction for newer Kafka client API expectations.
kogito-serverless-workflow/kogito-serverless-workflow-executor-kafka/src/test/java/org/kie/kogito/serverless/workflow/executor/MockKafkaEventEmitterFactory.java Updates MockProducer construction for newer Kafka client API expectations.
kogito-build/kogito-dependencies-bom/pom.xml Updates core dependency versions (Quarkus/Spring/Kafka/Jackson/etc.) and aligns select transitive overrides (e.g., lz4 relocation).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

@gitgabrio gitgabrio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @jeejz , great stuff!
Could you please verify why all the downstream build failed ? Pls check that those have used your "quarkus upgrade" branches.
Could you also pls include, in the description, all the PRs that are part of this quarkus upgrade task: thx!

@pefernan pefernan self-requested a review February 4, 2026 08:48
@pefernan pefernan marked this pull request as ready for review February 4, 2026 16:59
@pefernan pefernan marked this pull request as draft February 4, 2026 17:00
@pefernan
Copy link
Contributor

pefernan commented Feb 4, 2026

sorry, marked it ready for review by mistake

@jeejz jeejz marked this pull request as ready for review February 12, 2026 05:30
@apache apache deleted a comment from kie-ci3 Feb 12, 2026
@apache apache deleted a comment from kie-ci3 Feb 12, 2026
@apache apache deleted a comment from kie-ci3 Feb 12, 2026
@apache apache deleted a comment from kie-ci3 Feb 12, 2026
@apache apache deleted a comment from kie-ci3 Feb 12, 2026
@apache apache deleted a comment from kie-ci3 Feb 12, 2026
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 47 out of 47 changed files in this pull request and generated 8 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 46 to 50
/**
* The TrustyService image to use.
*/
@ConfigItem
public String imageName;
Optional<String> imageName();

Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imageName() is defined as Optional<String> with no default. Since DevServices container startup requires an image name, consider providing a default via @WithDefault (and returning String) or ensure callers handle the empty case explicitly (rather than propagating null and failing later).

Copilot uses AI. Check for mistakes.
Comment on lines 321 to +327
public TrustyServiceDevServiceConfig(final KogitoDevServicesBuildTimeConfig config) {
this.devServicesEnabled = config.enabled.orElse(true);
this.imageName = config.imageName;
this.fixedExposedPort = config.port.orElse(0);
this.shared = config.shared;
this.serviceName = config.serviceName;
this.portUsedByTest = config.portUsedByTest;
this.devServicesEnabled = config.enabled().orElse(true);
this.imageName = config.imageName().orElse(null);
this.fixedExposedPort = config.port().orElse(0);
this.shared = config.shared();
this.serviceName = config.serviceName();
this.portUsedByTest = config.portUsedByTest();
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imageName is now populated via config.imageName().orElse(null). If the property isn’t set, this will later cause a NullPointerException when DockerImageName.parse(config.imageName) is called during container startup. Consider making imageName required (non-Optional) or providing a safe default / explicit error when absent instead of storing null here.

Copilot uses AI. Check for mistakes.
Comment on lines 46 to 89
private static final String TEST_NAMESPACE = "serverless-workflow-greeting-quarkus";
private final KubernetesServer server = new KubernetesServer(false, true); // Use CRUD mode
private static KubernetesMockServer server;
private KubernetesClient client;

@Override
public Map<String, String> start() {
try {
server.before(); // Start the mock Kubernetes server
} catch (Exception e) {
throw new RuntimeException("Failed to start Kubernetes mock server", e);
}
// Fabric8 7.3.1: Create mock server with CRUD mode via KubernetesCrudDispatcher.
// Context is fully qualified to avoid clash with QuarkusTestResourceLifecycleManager.Context.
// useHttps=false to avoid SSL handshake overhead in tests.
server = new KubernetesMockServer(
new io.fabric8.mockwebserver.Context(),
new MockWebServer(),
new HashMap<>(),
new KubernetesCrudDispatcher(),
false);
server.init();

String mockServerUrl = server.getClient().getConfiguration().getMasterUrl();
// Fabric8 7.x: createClient() replaces getClient() from Fabric8 6.x
client = server.createClient();
String mockServerUrl = client.getConfiguration().getMasterUrl();

// Ensure the Fabric8 client picks up the mock server
System.setProperty(Config.KUBERNETES_MASTER_SYSTEM_PROPERTY, mockServerUrl);

Map<String, String> config = new HashMap<>();
config.put("quarkus.kubernetes-client.master-url", mockServerUrl);
config.put("quarkus.kubernetes-client.namespace", TEST_NAMESPACE);
config.put("quarkus.kubernetes-client.trust-certs", "true");
return config;
}

@Override
public void stop() {
if (client != null) {
client.close();
}
if (server != null) {
server.after(); // Stop the mock server
server.destroy();
server = null;
}
}

/**
* Expose the Fabric8 Kubernetes mock server instance for advanced use in tests.
*/
public KubernetesServer getServer() {
public static KubernetesMockServer getServer() {
return server;
}
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

server is now a static field but there are no usages of the static getServer() in the codebase. Keeping the mock server static increases the risk of state leaking between test classes (and makes parallel test execution unsafe). Prefer making server an instance field and getServer() non-static (or remove the accessor entirely if not needed).

Copilot uses AI. Check for mistakes.
Comment on lines +240 to +245
try {
Path tempDir = Files.createTempDirectory("kafka-streams-test");
properties.put(StreamsConfig.STATE_DIR_CONFIG, tempDir.toString());
} catch (IOException e) {
throw new RuntimeException("Failed to create temp directory for Kafka Streams state", e);
}
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Files.createTempDirectory(...) creates a new state dir for Kafka Streams but it’s never cleaned up, which can leave many temp folders behind on developer machines / CI workers. Consider registering it for deletion (e.g., deleteOnExit() and/or deleting recursively in @AfterEach), or use JUnit’s @TempDir so lifecycle cleanup is automatic.

Copilot uses AI. Check for mistakes.
Copy link
Contributor

@pefernan pefernan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @jeejz first of all thank you for this enormous task!

I dropped a few comments.. mostly about some comments that I don't consider needed and some version adjustments

@jeejz jeejz changed the title [DO-NOT-MERGE][incubator-kie-issues-2204] Quarkus upgrade 3.27 and Spring Boot to 3.5.10 [incubator-kie-issues-2204] Quarkus upgrade 3.27 and Spring Boot to 3.5.10 Feb 18, 2026
@apache apache deleted a comment from kie-ci3 Feb 18, 2026
}
repository.persist(outputEntity);
// No explicit persist needed: parent has @OneToMany(cascade = CascadeType.ALL),
// so child entities are automatically persisted when the parent is saved.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jeejz See this can be removed too

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is removed.

metadataEntity.setJavaType(value.getClass().getName());
}
repository.persist(metadataEntity);
// No explicit persist needed: parent has @OneToMany(cascade = CascadeType.ALL),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jeejz See this can be removed too

(Out of curiosity, keeping the persist call results in some issue?

Copy link
Contributor

@martinweiler martinweiler left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work on this huge effort @jeejz - thank you!

@jeejz jeejz force-pushed the quarkus_upgrade_3.27 branch from f35d1ed to 64bbe68 Compare February 19, 2026 06:05
@jeejz jeejz force-pushed the quarkus_upgrade_3.27 branch from 64bbe68 to 757e9ee Compare February 19, 2026 07:32
@kie-ci3
Copy link
Contributor

kie-ci3 commented Feb 19, 2026

PR job #37 was: UNSTABLE
Possible explanation: This should be test failures

Reproducer

build-chain build full_downstream -f 'https://raw.githubusercontent.com/${AUTHOR:apache}/incubator-kie-kogito-pipelines/${BRANCH:main}/.ci/buildchain-config-pr-cdb.yaml' -o 'bc' -p apache/incubator-kie-kogito-runtimes -u #4178 --skipParallelCheckout

NOTE: To install the build-chain tool, please refer to https://github.com/kiegroup/github-action-build-chain#local-execution

Please look here: https://ci-builds.apache.org/job/KIE/job/kogito/job/main/job/pullrequest_jobs/job/kogito-runtimes-pr/job/PR-4178/37/display/redirect

Test results:

  • PASSED: 3936
  • FAILED: 1

Those are the test failures:

org.kie.kogito.integrationtests.quarkus.TaskIT.testUpdateTaskInfo 1 expectation failed.
Expected status code <403> but was <200>.

@fjtirado fjtirado self-requested a review February 19, 2026 12:53
@pefernan
Copy link
Contributor

all greens @jeejz ª

@apache apache deleted a comment from kie-ci3 Feb 19, 2026
@yesamer yesamer merged commit 0a49888 into apache:main Feb 19, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Upgrade Quarkus from 3.20.3 (LTS) to 3.27.2 (LTS)

9 participants